Remote Sensing Index • Snow & Ice

ICEI – Ice Cover Extent Index

ICEI is a binary snow/ice cover index derived from the Normalized Difference Snow Index (NDSI), used to map the presence or absence of snow and ice over large areas with optical satellite data.

1. Concept & Formula

The Ice Cover Extent Index (ICEI) is designed to identify and map snow or ice-covered surfaces from multispectral satellite imagery. A common approach is to first compute the NDSI using a Green and SWIR band, then apply a threshold to obtain a binary mask of snow/ice presence.

Base Snow Index (NDSI)

A typical NDSI formulation is:

NDSI = (GREEN – SWIR) / (GREEN + SWIR) Dimensionless (–1 to +1)

ICEI (Binary Snow/Ice Mask)

ICEI is then obtained by thresholding NDSI:

ICEI = NDSI > T 0 = No snow/ice, 1 = Snow/ice

Where T is a threshold (often between 0.3–0.5) depending on the sensor, region, and atmospheric conditions.

Typical Interpretation

ICEI Value Interpretation
0 No snow/ice (bare soil, water, vegetation, urban surfaces)
1 Snow or ice-covered pixels (high NDSI response)

Main Applications

  • Snow cover mapping and monitoring
  • Glacier and ice-sheet extent analysis
  • Hydrological modeling and runoff estimation
  • Climate and cryosphere studies

2. Data & Bands for ICEI

Common Sensors & Bands

  • Sentinel-2 (ESA) – 10–20 m
    • Green: B3 (~560 nm)
    • SWIR: B11 (~1610 nm) or B12 (~2190 nm)
  • Landsat 8/9 OLI – 30 m
    • Green: B3
    • SWIR: B6 or B7

Good Practice

  • Use surface reflectance products with atmospheric correction.
  • Mask clouds and cloud shadows before computing NDSI/ICEI.
  • Adjust the threshold T for specific regions and seasons using reference data or visual inspection.
  • Combine with elevation or temperature data to refine snow/ice mapping.

Limitations

  • Bright non-snow features (e.g., salt pans, some clouds) may be misclassified.
  • Forest canopies with snow beneath may reduce the apparent NDSI signal.
  • Requires clear-sky conditions for optical sensors.

3. Google Earth Engine Code – ICEI for Any AOI

Steps: open code.earthengine.google.com → New Script → paste the code → draw your AOI as geometry on the map → click Run. Then export ICEI as GeoTIFF to Google Drive.

// ICEI – Ice Cover Extent Index using Sentinel-2 SR
// -------------------------------------------------
// This script computes NDSI and then a binary ICEI mask for any AOI.
//
// 1) Go to: https://code.earthengine.google.com
// 2) Click "New Script" and paste this code.
// 3) On the map: draw your AOI (Polygon/Rectangle).
//    It will appear as a variable named 'geometry' in the left panel.
// 4) Click "Run" to display ICEI.
// 5) In the Tasks tab, click "Run" to export ICEI to Google Drive.

// -------------------------------------------------------
// 1. Define Area of Interest (AOI)
// -------------------------------------------------------
var roi = geometry;  // Make sure a 'geometry' object exists in the left panel

// Center the map on the AOI
Map.centerObject(roi, 8);

// -------------------------------------------------------
// 2. Define date range and basic parameters
// -------------------------------------------------------
var startDate = '2023-01-01';
var endDate   = '2023-12-31';

// NDSI threshold to create binary ICEI mask
var ndsiThreshold = 0.4;   // adjust 0.3–0.5 if needed

// -------------------------------------------------------
// 3. Load Sentinel-2 SR data and pre-process
// -------------------------------------------------------
var s2_sr = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterBounds(roi)
  .filterDate(startDate, endDate)
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 30));

// Simple cloud mask using QA band (SCL)
function maskS2clouds(img) {
  var scl = img.select('SCL');
  // Keep only non-cloud classes (e.g. 1:SATURATED/DEFECTIVE, 2:DARK_AREA, 4:VEGETATION,
  // 5:NOT_VEGETATED, 6:WATER, 7:UNCLASSIFIED, 11:SNOW/ICE)
  var mask = scl.eq(2)
    .or(scl.eq(4))
    .or(scl.eq(5))
    .or(scl.eq(6))
    .or(scl.eq(7))
    .or(scl.eq(11));
  return img.updateMask(mask);
}

var s2_clean = s2_sr.map(maskS2clouds);

// Create a median composite
var composite = s2_clean.median().clip(roi);

// -------------------------------------------------------
// 4. Compute NDSI and ICEI
// -------------------------------------------------------
// Green: B3 (~560 nm)
// SWIR:  B11 (~1610 nm) - you may also test B12 (~2190 nm)
var green = composite.select('B3');
var swir  = composite.select('B11');

// NDSI
var ndsi = green.subtract(swir)
  .divide(green.add(swir))
  .rename('NDSI');

// ICEI: binary mask (1 = snow/ice, 0 = no snow/ice)
var icei = ndsi.gt(ndsiThreshold).rename('ICEI');

// -------------------------------------------------------
// 5. Visualization
// -------------------------------------------------------
var ndsiVis = {
  min: -1.0,
  max: 1.0,
  palette: [
    '#1d3557', // low
    '#457b9d',
    '#a8dadc',
    '#f1faee',
    '#ffffff'  // high NDSI
  ]
};

// Binary ICEI palette: 0 = dark, 1 = bright cyan
var iceiVis = {
  min: 0,
  max: 1,
  palette: ['#0b1020', '#00e5ff']
};

// Add NDSI and ICEI layers
Map.addLayer(ndsi, ndsiVis, 'NDSI (Sentinel-2)', false);
Map.addLayer(icei, iceiVis, 'ICEI (Snow/Ice Mask)', true);

// Optional: true color for context
var s2_rgb = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterBounds(roi)
  .filterDate(startDate, endDate)
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 30))
  .select(['B4','B3','B2'])  // RGB
  .median()
  .clip(roi);

Map.addLayer(s2_rgb, {min: 0, max: 3000}, 'True Color (RGB)', false);

// -------------------------------------------------------
// 6. Export ICEI as GeoTIFF to Google Drive
// -------------------------------------------------------
Export.image.toDrive({
  image: icei,
  description: 'ICEI_Export',
  fileNamePrefix: 'ICEI_Export',
  folder: 'EarthEngine_Exports',  // you can change the folder name
  region: roi,
  scale: 20,                      // Sentinel-2 resolution (10 or 20 m)
  crs: 'EPSG:4326',
  maxPixels: 1e13
});